package com.atguigu.bigdata.scala.chapter05

object Scala07_Function_Hell_5 {

    def main(args: Array[String]): Unit = {

        // TODO 函数式编程 - 地狱

        def test( f : (String)=>Unit ): Unit = {
            f("lisi")
        }

        def fun( name : String ): Unit = {
            println(name)
        }
        //test(fun)
//
//      //  test(
//      //      ( name : String ) => {
//      //          println(name)
//      //      }
//      //  )
//
        //test( (name:String) => {println(name)} )
        //test( (name:String) => println(name) )
        //test( (name) => println(name) )
        //test( name => println(name) )
        //test( println(_) )

        // 此行代码不是至简原则的代码
        // Scala中默认提供了一个println方法，这个方法的类型和我们要求的是一致的，所以可以直接使用
        //println("zhangsan")
        //test( println )

        def test1( f : (Int, Int)=>Int ): Unit = {
            val result = f(10, 20)
            println(result)
        }

        //test1( (x:Int, y:Int) => { x + y } )
        //test1( (x:Int, y:Int) => x + y )
        //test1( (x, y) => x + x )
        //// TODO 如果参数按照顺序在代码中只使用了一次，可以采用下划线代替
        //test1( _ + _ ) // 这里的下划线类似于SQL模糊查询时的占位符下划线
        // __a%

        // 在匿名函数使用时，下划线不能嵌套调用其中参数的属性或方法
        test( s => println(s.substring(0,1)) )
        test( _.substring(0,1) )
        //test( println(_.substring) ) (X)





    }
}
